package framework.classification.entities;

import java.util.ArrayList;
import java.util.Iterator;

import framework.AnnuaireCocola;
import framework.classification.entities.lattice.TreillisI;
import framework.classification.library.AbstractClassfication;
import framework.entity.ACLEntity;
import framework.entity.ACLFunction;
import framework.entity.ACLInterface;

public class ClInterfaceProvided extends ClAbstractEntity {

	
	public static String INTERFACE_PROVIDED = "Interface_Provided";
	
	private ArrayList<ACLInterface> interfaces;

	public ClInterfaceProvided(String s, AbstractClassfication cl,TreillisI t, ArrayList<ACLInterface> inter) {
		super(s, cl, t);
		interfaces = inter;
		createTableModel();
		int x = getAttribut().size();
		int y = getEntity().size();
		table = new int[x][y];
		calculPair();

	}

	public void createTableModel() {

		// on ajoute toutes les interfaces dans les lignes
		for (ACLInterface inter : interfaces){
			getEntity().add(inter.getName());
		}
		//on ajoute les fonctions fourni des interfaces dans les colonnes
		// ainse que les nouvelles fonctions deduite 
		for (ACLInterface inter : interfaces){
			
			
			ArrayList<ACLFunction> functions = inter.getFunctions();
			for (ACLFunction func : functions){
				
				//on recupere la classification de la fonction correspondante
				ClFunctionProvided clfunc = cl.getFunctionsProvided().get(func.toString());
				//on ajoute les fonctions abstraite
				for (String absfunc : clfunc.getAbstractReduced().keySet()){
					if (!getAttribut().contains(absfunc))
						getAttribut().add(absfunc);
					
				}
				//on ajoute les fonctions reel
				for (String realfunc : clfunc.getRealReduced().keySet()){
					if (!getAttribut().contains(realfunc))
						getAttribut().add(realfunc);
					
				}
			}
			
		}
	}

	public void calculPair() {
		for (int x = 0; x < this.getAttribut().size(); x++) {
			for (int y = 0; y < this.getEntity().size(); y++) {

				if (isPair(getAttribut().get(x), getEntity().get(y))){
					table[x][y] = 1;
				}
				else
					table[x][y] = 0;
			}
		}
		
	}

	// renvoie vrai si le concept de func est parent d'au moin un concept 
	// represant une fonction de inter
	public Boolean isPair(String func, String inter) {
		
		
		ACLFunction aclFunc = new ACLFunction(func,ACLFunction.MODE2);
		
		//on recupere la classification de la fonction func
		ClFunctionProvided clFunc = getAbstractClassfication().getFunctionsProvided().get(aclFunc.toString());
		
		//on recupere les fonctions de l'interface
		ArrayList<ACLFunction> functions = getAbstractClassfication().getStructure().getInterfacesFonction().get(inter);
		
		for (ACLFunction funcinter : functions){
			
			
			if (clFunc.getLattice().isParent(func,funcinter.toString()))
				return true;
		
		}
		return false;
		
	}



	
	public String getType() {
		// TODO Auto-generated method stub
		return INTERFACE_PROVIDED;
	}

	@Override
	public ACLEntity getACLEntity(String s) {
		// TODO Auto-generated method stub
		return null;
	}

	



}
